<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意：答案中不可以包含重复的三元组。 -->
</body>

</html>
<script>
    var threeSum = function (nums) {
        // 最左侧值为定值,右侧所有值进行两边推进计算
        let res = [];
        nums.sort((a, b) => a - b);
        let size = nums.length;
        if (nums[0] <= 0 && nums[size - 1] >= 0) {
            // 保证有正数负数
            let i = 0;
            while (i < size - 2) {
                if (nums[i] > 0) break; // 最左侧大于0,无解
                let first = i + 1;
                let last = size - 1;
                while (first < last) {
                    if (nums[i] * nums[last] > 0) break; // 三数同符号,无解
                    let sum = nums[i] + nums[first] + nums[last];
                    if (sum === 0) {
                        res.push([nums[i], nums[first], nums[last]]);
                    }
                    if (sum <= 0) {
                        // 负数过小,first右移
                        while (nums[first] === nums[++first]) { } // 重复值跳过
                    } else {
                        while (nums[last] === nums[--last]) { } // 重复值跳过
                    }
                }
                while (nums[i] === nums[++i]) { }
            }
        }

        return res;
    };
    // while (nums[first] === nums[++first]) {} // 重复值跳过 就类似这句话 到底是干了啥 ?
    // 等同于while(nums[first] === nums[first+1]){first = first +1;}就是如果后一位和前一位 相等就会进入循环,再+1比较,直到不相等才会退出循环
    console.log(threeSum([-1,0,1,2,-1,-4]));[-1, -1, 2]
    [-1, 0, 1]
</script>